'''编写程序,实现文件备份功能'''
def copy():
    filename_1 = input('请输入需要备份的文件名:')
    filename_2 = input('请输入新的文件名:')
    with open(filename_1,mode='r',encoding='utf-8') as old:
        old_file = old.read()
    with open(filename_2,mode='w',encoding='utf-8') as new:
        new.write(old_file)
if __name__ == '__main__':
    copy()


def copy_file():
    # 输入处理（支持带空格的路径）
    source = input('请输入要备份的文件路径: ').strip()  # 获取用户输入，去除首尾的空格/换行符
    target = input('请输入备份文件路径（留空自动生成）: ').strip()  # 同上，若留空则自动生成目标路径

    try:
        # 自动生成备份文件名（原文件名_bak.后缀）
        if not target:  # 若用户未输入目标路径
            import os  # 导入操作系统路径处理模块
            base = os.path.basename(source)  # 提取纯文件名（如 "data.txt" → "data.txt"）
            name, ext = os.path.splitext(base)  # 拆分主名和扩展名（如 "data" 和 ".txt"）
            target = f"{name}_bak{ext or ''}" # 生成备份名（如 "data_bak.txt"）
            '''os.path.basename()：提取路径中的文件名（兼容不同操作系统路径分隔符）
               ext or ''：处理无扩展名文件（如 document → document_bak）'''
        # 二进制模式兼容所有文件类型
        with open(source, 'rb') as src, open(target, 'wb') as dst: # 同时打开源文件（读）和备份文件（写）
            # 分块读取避免内存溢出（10MB一块）
            while True: # 循环读取数据块
                chunk = src.read(10 * 1024 * 1024)  # 读取10MB数据块
                if not chunk: # 若读取不到数据（文件已读完）
                    break # 退出循环
                dst.write(chunk) # 将数据块写入目标文件

        print(f"✅ 备份成功！文件已保存至：{target}")

    except FileNotFoundError:
        print(f"❌ 错误：源文件 '{source}' 不存在")
    except PermissionError:
        print("❌ 错误：没有权限访问文件")
    except Exception as e:
        print(f"❌ 未知错误：{str(e)}")
    '''rb/wb：二进制模式（处理图片、视频等非文本文件不损坏）
    with open...：上下文管理器（自动关闭文件，避免资源泄漏）
    read(10*1024*1024)：分块读取策略（保护内存安全，大文件不崩溃）
    while循环：持续搬运数据直到文件末尾'''


if __name__ == '__main__':
    copy_file()